package org.example.ruangong.service.impl;

import org.example.ruangong.mapper.EntryKeysMapper;
import org.example.ruangong.mapper.EntryMapper;
import org.example.ruangong.mapper.EntryUsersMapper;
import org.example.ruangong.model.Entry;
import org.example.ruangong.model.EntryKeys;
import org.example.ruangong.model.EntryUsers;
import org.example.ruangong.service.EntryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 功能描述：
 */
@Service
public class EntryServiceImpl implements EntryService {

//    @Override
//    public void addEntry(Entry entry) {
//
//    }
//
//    @Override
//    public void putEntry(Entry entry) {
//
//    }
//
//    @Override
//    public Entry getEntryById(Integer eid) {
//        // 实现根据ID获取词条的数据库操作
//    }
//
//    @Override
//    public void updateEntry(Entry entry, Integer modifierId) {
//        // 1. 更新词条基本信息
//        // 2. 将修改者ID添加到用户列表（EntryUsers表）
//        // 3. 更新修改时间
//    }
//
//    @Override
//    public List<Entry> getEntriesByKey(String key) {
//        // 实现根据关键词查询词条的数据库操作
//        // 可以使用SQL模糊查询：SELECT * FROM entry WHERE keys LIKE '%key%'
//        // 或者使用全文索引进行更高效的搜索
//    }
//
//    @Override
//    public List<Entry> getEntriesByUid(String uid) {
//        // 实现根据用户ID查询词条的数据库操作
//        // 查询该用户修改过的所有词条
//    }
//
//    @Override
//    public boolean keyExists(Integer eid, String key) {
//        // 检查指定词条是否已包含该关键词
//    }
//
//    @Override
//    public void addKey(Integer eid, String key, Integer userId) {
//        // 1. 向EntryKeys表添加新记录
//        // 2. 更新EntryUsers表（添加修改记录）
//    }
//
//    @Override
//    public void deleteKey(Integer eid, String key, Integer userId) {
//        // 1. 从EntryKeys表删除记录
//        // 2. 更新EntryUsers表（添加修改记录）
//    }
    @Autowired
    private EntryMapper entryMapper;

    @Autowired
    private EntryUsersMapper entryUsersMapper;

    @Autowired
    private EntryKeysMapper entryKeysMapper;

    @Override
    public void addEntry(Entry entry) {
        System.out.println(entry);
        entryMapper.insertEntry(entry);
//        entryMapper.insertEntry(entry);
        System.out.println(entry);
        // 2. 更新EntryUsers表（添加修改记录）
        EntryUsers entryUser = new EntryUsers();
        entryUser.setEid(entryUser.getEid());
        entryUser.setUid(entry.getUsers());
        entryUser.setUpdatetime(new Date());
        entryUsersMapper.insertOrUpdateEntryUser(entryUser);

        System.out.println(entryUser);
    }

    @Override
    public void putEntry(Entry entry) {
        entryMapper.updateEntry(entry);

        EntryUsers entryUser = new EntryUsers();
        entryUser.setEid(entryUser.getEid());
        entryUser.setUid(entry.getUsers());
        entryUser.setUpdatetime(new Date());
        entryUsersMapper.insertOrUpdateEntryUser(entryUser);
    }

    @Override
    public Entry getEntryById(Integer eid) {
        return entryMapper.selectEntryById(eid);

    }

    @Override
    @Transactional
    public void updateEntry(Entry entry, Integer modifierId) {
        // 1. 更新词条基本信息
        entryMapper.updateEntry(entry);

        // 2. 将修改者ID添加到用户列表（EntryUsers表）
        EntryUsers entryUser = new EntryUsers();
        entryUser.setEid(entry.getEid());
        entryUser.setUid(modifierId);
        entryUser.setUpdatetime(new Date());
        entryUsersMapper.insertOrUpdateEntryUser(entryUser);
    }

    @Override
    public List<Entry> getEntriesByKey(String key) {
        return entryMapper.selectEntriesByKey("%" + key + "%");
    }

    @Override
    public List<Entry> getEntriesByUid(Integer uid) {
        return entryMapper.selectEntriesByUid(uid);
    }

    @Override
    public boolean keyExists(Integer eid, String key) {
        return entryKeysMapper.countKey(eid, key) > 0;
    }

    @Override
    @Transactional
    public void addKey(Integer eid, String key, Integer userId, Entry entry) {
        // 1. 向EntryKeys表添加新记录
        entryKeysMapper.insertEntryKey(eid, key);
        StringBuilder sb = new StringBuilder(entry.getKeys());
        sb.append(" ").append(key);
        entry.setKeys(sb.toString());
        entryMapper.insertEntry(entry);
    }
    @Override
    @Transactional
    public void deleteKey(Integer eid, String key, Integer userId, Entry entry) {
        // 1. 从EntryKeys表删除记录

        String[] keyArray = entry.getKeys().split("\\s+");
        List<String> resultList = new ArrayList<>();

        for (String k : keyArray) {
            boolean shouldRemove = false;
            if (k.equals(key)) {
                shouldRemove = true;
            }

            if (!shouldRemove) {
                resultList.add(k);
            }
            else{
                entryKeysMapper.deleteEntryKey(eid, k);
            }
        }

        String k = String.join(" ", resultList);
        entry.setKeys(k);
        entryMapper.updateEntry(entry);
    }
//    @Override
//    @Transactional
//    public void deleteKey(Integer eid, String[] key, Integer userId, Entry entry) {
//        // 1. 从EntryKeys表删除记录
////        entryKeysMapper.deleteEntryKey(eid, key);
//
//        String[] keyArray = entry.getKeys().split("\\s+");
//        List<String> resultList = new ArrayList<>();
//        for (String k : keyArray) {
//            boolean shouldRemove = false;
//            for (String keyToDelete : key) {
//                if (k.equals(keyToDelete)) {
//                    shouldRemove = true;
//                    break;
//                }
//            }
//            if (!shouldRemove) {
//                resultList.add(k);
//            }
//            else{
//                entryKeysMapper.deleteEntryKey(eid, k);
//            }
//        }
//        String k = String.join(" ", resultList);
//        entry.setKeys(k);
//        entryMapper.updateEntry(entry);
//
//        // 2. 更新EntryUsers表（添加修改记录）
//        EntryUsers entryUser = new EntryUsers();
//        entryUser.setEid(eid);
//        entryUser.setUid(userId);
//        entryUser.setUpdatetime(new Date());
//        entryUsersMapper.insertOrUpdateEntryUser(entryUser);
//    }
}
